import { Point } from '../entity/point'

import { MenuItem } from './item'

export { MenuItem } from './item'

/**
 * 创建右键菜单时的选项对象
 */
export interface ContextMenuOptions {
    /**
     * 指定此菜单项的宽度，菜单以最长的菜单项宽度为准
     *
     * 默认值为 `120`
     */
    width?: number
}

/**
 * 右键菜单事件工厂对象
 */
type ContextMenuEventFactory = {
    open: (event: { type: 'open', target: ContextMenu, point: Point }) => void;

    close: (event: { type: 'close', target: ContextMenu }) => void;
}

/**
 * 此类表示右键菜单。您可以在地图上添加自定义内容的右键菜单
 */
export interface ContextMenu {
    /**
     * 创建一个右键菜单实例
     */
    new(opts: ContextMenuOptions): ContextMenu;

    /**
     * 添加菜单项
     */
    addItem: (item: MenuItem) => void;

    /**
     * 移除菜单项
     */
    removeItem: (item: MenuItem) => void;

    /**
     * 返回指定索引位置的菜单项，第一个菜单项的索引为 `0`
     */
    getItem: (index: number) => MenuItem;

    /**
     * 返回所有的菜单项
     */
    getItems: () => Array<MenuItem>;

    /**
     * 添加分隔符
     */
    addSeparator: () => void;

    /**
     * 移除指定索引位置的分隔符，第一个分隔符的索引为 `0`
     */
    removeSeparator: (index: number) => void;

    /**
     * 返回所有分割线
     */
    getAllSeparator: () => [];

    /**
     * 添加事件监听函数
     */
    addEventListener: <Event extends keyof ContextMenuEventFactory>(event: Event, handler: ContextMenuEventFactory[Event]) => void;

    /**
     * 移除事件监听函数
     */
    removeEventListener: <Event extends keyof ContextMenuEventFactory>(event: Event, handler: ContextMenuEventFactory[Event]) => void
}
